package com.shenqi.language.mapper;

import java.util.List;
import com.shenqi.language.domain.Vocabulary;
import com.shenqi.language.vo.VocabularyWithUserMarkVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

/**
 * 词条Mapper接口
 * 
 * @author shenqi
 * @date 2025-08-05
 */
public interface VocabularyMapper 
{
    /**
     * 查询词条
     * 
     * @param id 词条主键
     * @return 词条
     */
    public Vocabulary selectVocabularyById(Long id);

    /**
     * 查询词条列表
     * 
     * @param vocabulary 词条
     * @return 词条集合
     */
    public List<Vocabulary> selectVocabularyList(Vocabulary vocabulary);

    /**
     * 新增词条
     * 
     * @param vocabulary 词条
     * @return 结果
     */
    public int insertVocabulary(Vocabulary vocabulary);

    /**
     * 修改词条
     * 
     * @param vocabulary 词条
     * @return 结果
     */
    public int updateVocabulary(Vocabulary vocabulary);

    /**
     * 删除词条
     * 
     * @param id 词条主键
     * @return 结果
     */
    public int deleteVocabularyById(Long id);

    /**
     * 批量删除词条
     * 
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteVocabularyByIds(Long[] ids);

    /**
     * 选择多个category下的词条
     * @param categoryIds category 的 id
     * @return 词条集合
     */
    List<Vocabulary> selectVocabularyByCategoryIds(@Param("categoryIds") List<Long> categoryIds);

    /**
     * 选择多个category下的随机词条
     * @param categoryIds category 的 id
     * @return 词条集合
     */
    List<Vocabulary> selectRandomVocabularyByCategoryIds(@Param("categoryIds") List<Long> categoryIds);


    /**
     * 根据多个分类ID和用户ID查询词汇列表及用户标记
     * @param categoryIds 分类ID集合
     * @param userId 用户ID
     * @return 词汇列表及用户标记
     */
    List<VocabularyWithUserMarkVO> selectByCategoryIdsWithUserMark(
            @Param("categoryIds") List<Long> categoryIds,
            @Param("userId") Long userId,
            @Param("userMarkStatus") Integer userMarkStatus);

    /**
     * 根据多个分类ID和用户ID查询词汇列表及用户标记
     * @param categoryIds 分类ID集合
     * @param userId 用户ID
     * @param userMarkStatus 用户标记
     * @return 词汇列表及用户标记
     */
    List<VocabularyWithUserMarkVO> selectRandomVocabularyByCategoryIdsAndUserMark(
            @Param("categoryIds") List<Long> categoryIds,
            @Param("userMarkStatus") Integer userMarkStatus,
            @Param("userId") Long userId,
            @Param("isSorted") Boolean isSorted);

    /**
     * 根据多个分类ID和用户ID查询词汇列表下某个标记的总数量
     * @param categoryIds 分类ID集合
     * @param userId 用户ID
     * @param userMarkStatus 用户标记
     * @return 词汇列表及用户标记
     */
    Integer countByCategoryIdsAndUserMark(@Param("categoryIds") List<Long> categoryIds,
                                          @Param("userMarkStatus") Integer userMarkStatus,
                                          @Param("userId") Long userId);
}
